# parameter_frame.py
import os

from PyQt5.QtWidgets import QFrame, QLabel, QLineEdit, QPushButton, QFileDialog, QMessageBox
from PyQt5.QtGui import QFont
from PyQt5.QtCore import  Qt

class ParameterDisplay(QFrame):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setStyleSheet("background-color: white; border: 2px solid white;")  # 设置框架的背景为白色，边框为黑色
        self.setFixedSize(440, 320)  # 设置显示区域的固定大小
        # 设置位置
        self.setGeometry(20, 100 + 320 + 20, 1000, 200)  # 在窗口中的位置为 (100, 100)，宽度为 1200，高度为 500
        # 你可以在这里添加该框架的其他功能代码

        self.set_title()  # 添加标题

        # 创建按钮
        self.button1 = QPushButton("权重", self)
        self.button2 = QPushButton("置信度", self)
        self.button3 = QPushButton("IOU阈值", self)
        self.button4 = QPushButton("图片大小", self)
        self.button5 = QPushButton("保存txt", self)
        self.button6 = QPushButton("保存conf", self)
        self.button7 = QPushButton("保存crop", self)

        # 创建对应的文本框（显示路径和状态）
        self.path_label1 = QLabel("", self)
        self.path_label2 = QLineEdit(self)
        self.path_label3 = QLineEdit(self)
        self.path_label4 = QLineEdit(self)

        # 结果txt按钮逻辑
        self.txt_save_status = True  # 默认状态为保存
        self.path_label5 = QLabel("否", self)

        self.conf_save_status = True  # 默认状态为保存
        self.path_label6 = QLabel("否", self)

        self.crop_save_status = True  # 默认状态为保存
        self.path_label7 = QLabel("否", self)


        # 设置按钮的位置和大小
        self.button1.setGeometry(-10, 90, 150, 40)
        self.button2.setGeometry(-10, 145, 165, 40)
        self.button3.setGeometry(190, 145, 165, 40)
        self.button4.setGeometry(-10, 200, 165, 40)
        self.button5.setGeometry(190, 200, 165, 40)
        self.button6.setGeometry(-10, 255, 165, 40)
        self.button7.setGeometry(190, 255, 165, 40)

        # 设置文本框的位置和大小
        self.path_label1.setGeometry(120, 90, 280, 40)
        self.path_label2.setGeometry(120, 145, 80, 40)
        self.path_label3.setGeometry(320, 145, 80, 40)
        self.path_label4.setGeometry(120, 200, 80, 40)
        self.path_label5.setGeometry(320, 200, 80, 40)
        self.path_label6.setGeometry(120, 255, 80, 40)
        self.path_label7.setGeometry(320, 255, 80, 40)

        # 设置文本框背景颜色、边框和圆角
        self.set_textbox_style(self.path_label1)
        self.set_textbox_style(self.path_label2)
        self.set_textbox_style(self.path_label3)
        self.set_textbox_style(self.path_label4)
        self.set_textbox_style(self.path_label5)
        self.set_textbox_style(self.path_label6)
        self.set_textbox_style(self.path_label7)

        # 调整按钮文字大小
        font = QFont()
        font.setPointSize(14)  # 设置文字大小为14
        self.button1.setFont(font)
        self.button2.setFont(font)
        self.button3.setFont(font)
        self.button4.setFont(font)
        self.button5.setFont(font)
        self.button6.setFont(font)
        self.button7.setFont(font)


        # 设置默认值
        self.path_label2.setText("0.5")  # 设置置信度的默认值为 0.5
        self.path_label3.setText("0.45")  # 设置IOU阈值的默认值为 0.45
        self.path_label4.setText("608")  # 设置图片大小的默认值为 608


        # 设置实时验证功能，连接按钮事件
        self.button1.clicked.connect(self.load_weights)  # 加载权重
        self.path_label2.editingFinished.connect(self.validate_confidence)  # 置信度实时验证
        self.path_label3.editingFinished.connect(self.validate_iou)  # IOU阈值实时验证
        self.path_label4.editingFinished.connect(self.on_image_size_editing_finished)  # 图片大小实时验证
        self.button5.clicked.connect(self.toggle_txt_save)  # 点击txt保存
        self.button6.clicked.connect(self.toggle_conf_save)  # 点击conf保存
        self.button7.clicked.connect(self.toggle_crop_save)  # 点击conf保存

    def set_textbox_style(self, line_edit):
        # 设置文本框的背景颜色、边框和圆角
        line_edit.setStyleSheet("""
            background-color: #f0f0f0;  /* 背景颜色 */
            border: 2px solid #ccc;     /* 边框颜色 */
            border-radius: 5px;         /* 圆角效果 */
            padding: 5px;               /* 内边距 */
            color: red;                 /* 设置字体颜色为红色 */
        """)
        # 设置字体大小
        font = line_edit.font()
        font.setPointSize(12)  # 设置字体大小为12
        line_edit.setFont(font)

        # 设置文本居中
        line_edit.setAlignment(Qt.AlignCenter)  # 使文本内容居中

    def set_title(self):
        title = QLabel("检测参数设置", self)  # 设置标题文字
        title.setFont(QFont("仿宋", 18))  # 设置字体为仿宋，大小为16
        title.setAlignment(Qt.AlignCenter)  # 让文字居中
        title.setGeometry(0, 15, self.width(), 50)  # 设置位置，0为X轴，10为顶部间距，宽度为窗口宽度，高度为30
        title.setStyleSheet("color: black;  font-weight: bold;")  # 设置字体颜色为黑色

    def toggle_txt_save(self):
        # 切换结果保存状态
        if self.txt_save_status:
            self.txt_save_status = False
            self.path_label5.setText("是")  # 显示“是”
            # print("保存txt文档")
        else:
            self.txt_save_status = True
            self.path_label5.setText("否")  # 显示“否”
            # print("不保存txt文档")

    def toggle_conf_save(self):
        # 切换结果保存状态
        if self.conf_save_status:
            self.conf_save_status = False
            self.path_label6.setText("是")  # 显示“是”
            # print("保存conf")
        else:
            self.conf_save_status = True
            self.path_label6.setText("否")  # 显示“否”
            # print("不保存conf")

    def toggle_crop_save(self):
        # 切换结果保存状态
        if self.crop_save_status:
            self.crop_save_status = False
            self.path_label7.setText("是")  # 显示“是”
        else:
            self.crop_save_status = True
            self.path_label7.setText("否")  # 显示“否”





    def load_weights(self):
        # 打开文件对话框，选择权重文件（.pth 或 .pt 格式）
        file_name, _ = QFileDialog.getOpenFileName(self, "选择权重文件", "", "YOLO权重文件 (*.pth *.pt)")

        if file_name:
            # 显示选中的文件路径
            # self.path_label1.setText(f"{os.path.basename(file_name)}")
            self.path_label1.setText(f"{file_name}")
            print(f"已选择权重文件: {file_name}")

    # 置信度验证函数
    def validate_confidence(self):
        # 获取输入的置信度值
        confidence = self.path_label2.text()

        try:
            # 尝试将输入值转换为浮动数字
            confidence = float(confidence)

            # 验证置信度是否在0到1之间
            if 0 <= confidence <= 1:
                print(f"置信度: {confidence:.2f}")
            else:
                # 如果不在合法范围，弹出提示框
                self.show_error_message("置信度必须在0到1之间！")
                self.path_label2.clear()  # 清空文本框

        except ValueError:
            # 如果转换失败，说明输入的不是数字
            self.show_error_message("请输入有效的数字！")
            self.path_label2.clear()  # 清空文本框

    # IOU阈值验证函数
    def validate_iou(self):
        # 获取输入的IOU值
        iou = self.path_label3.text()

        try:
            # 尝试将输入值转换为浮动数字
            iou = float(iou)

            # 验证IOU是否在0到1之间
            if 0 <= iou <= 1:
                print(f"IOU阈值: {iou:.2f}")
            else:
                # 如果不在合法范围，弹出提示框
                self.show_error_message("IOU阈值必须在0到1之间！")
                self.path_label3.clear()  # 清空文本框

        except ValueError:
            # 如果转换失败，说明输入的不是数字
            self.show_error_message("请输入有效的数字！")
            self.path_label3.clear()  # 清空文本框

    def on_image_size_editing_finished(self):
        # 获取文本框中的值
        image_size = self.path_label4.text()

        try:
            # 尝试将输入的值转换为整数
            image_size = int(image_size)

            # 检查输入的值是否大于32
            if image_size <= 32:
                self.show_error_message("图片大小必须大于32！")
                self.path_label4.clear()  # 清空文本框
            else:
                print(f"图片大小设置为: {image_size}")

        except ValueError:
            # 如果转换失败，说明输入的不是数字
            self.show_error_message("请输入一个有效的整数！")
            self.path_label4.clear()  # 清空文本框

    def show_error_message(self, message):
        # 弹出提示框
        from PyQt5.QtWidgets import QMessageBox
        msg = QMessageBox()
        msg.setIcon(QMessageBox.Critical)
        msg.setText(message)
        msg.setWindowTitle("输入错误")
        msg.exec_()